Terraform Cloudのプライベートモジュールのテスト機能とテスト自動生成を試してみた
概要
概要は以下の記事を確認ください。
2023/10時点ではこの機能は、ベータです。利用するには、Plusプランが必要です。
やってみた
前提
テストを実施するには、公開ワークフローをブランチベースに設定しておく必要があります。
If your module uses the branch-based publishing workflow and its source code includes tests, you can enable testing at any time.
Testing Private Modules - Private Registry - Terraform Cloud | Terraform | HashiCorp Developerから引用
Private Registryでモジュールを公開する
以下のサンプルコードをGitHubにPushして、Private Registryで公開します。
variable "prefix" {} variable "name" {} resource "aws_sqs_queue" "this" { name = "${prefix}-${name}" sqs_managed_sse_enabled = true } output "queue_url" { value = aws_sqs_queue.this.url }
モジュール追加時に、publishing type
をBranch
にします。
また、テストを有効にするために、Testitng
をEnable testing for Module
にチェックをいれます。
上記の設定は登録済みのモジュールでも、いつでも変更可能です。
環境変数を設定
Testはクラウドプロバイダーの認証情報が必要です。
今回はAWSを例に設定します。
AWS認証情報とリージョンを設定します。AWS認証情報の権限はSQSを操作できる権限があれば大丈夫です。
通常であれば、リージョンはAWS Providerで設定可能ですが、module内ではAWS Providerを宣言しないため環境変数として設定します。 (2023/10時点では、Variables Setは対応していない)
Key | Value | Category |
---|---|---|
AWS_ACCESS_KEY_ID | <AWSアクセスキー> | env |
AWS_SECRET_ACCESS_KEY | <AWSシークレットアクセスキー> | env |
AWS_REGION | ap-northeast-1 | env |
テストファイルを生成しローカルにダウンロード
View test files
からテストファイルを確認しダウンロードします。
ファイルをダウンロードして、ローカルのモジュールがあるディレクトリに置きます。
$ ls -1 main.tf main.tftest.hcl
ローカルでテストを実行
テストファイルは以下のとおりです。
# WARNING: Generated module tests should be considered experimental and be reviewed by the module author. variables { prefix = "test" name = "queue" } run "attributes_validation" { assert { condition = aws_sqs_queue.this.name == "test-queue" error_message = "incorrect value for queue name" } assert { condition = aws_sqs_queue.this.sqs_managed_sse_enabled == true error_message = "incorrect value for sqs_managed_sse_enabled" } } run "output_validation" { assert { condition = output.queue_url == aws_sqs_queue.this.url error_message = "incorrect value for queue url" } }
以下の項目がチェックされます。
- SQSキュー名
- キューの暗号化
- アウトプットの値
テストファイルの構文は以下で確認できます。
Tests - Configuration Language | Terraform | HashiCorp Developer
ローカルでテストを実行してみましょう。以下のコマンドで実行できます。
$ terraform test -cloud-run=app.terraform.io/:ORG/:MODULE_NAME/:PROVIDER
今回の場合、MODULE_NAMEがmodule-test-sample
でPROVIDERは
aws`のため以下になります。
$ terraform test -cloud-run=app.terraform.io/<Org名>/module-test-sample/aws Waiting for the tests to start... (0s elapsed) Terraform v1.6.1 on linux_amd64 Initializing plugins and modules... main.tftest.hcl... in progress attributes_validation... pass output_validation... pass main.tftest.hcl... tearing down main.tftest.hcl... pass Success! 2 passed, 0 failed.
Success! 2 passed, 0 failed.
となっており、ローカルのテストが成功しました。
結果はTerraform Cloud上でも確認できます。
公開のタイミングでテストを実行
テスト機能を使ったモジュール公開の流れを試してみます。
誤って設定値を変更してしまったケースを想定して、SQSの暗号化を有効->無効に変更して公開してみます。
ハイライトの箇所を変更してGitHubにPushします。
variable "prefix" {} variable "name" {} resource "aws_sqs_queue" "this" { name = "${var.prefix}-${var.name}" sqs_managed_sse_enabled = false # trueからfalseに変更 } output "queue_url" { value = aws_sqs_queue.this.url }
$ git add . $ git commti -m "test" $ git push origin HEAD
Private Moduleを見ると、テストがfaileになっています。
テストは全てのコミットに対して実施されます。(公開まで行わなくても、VCS上にコミットが追加されたタイミングで)
テストの詳細を見てみると、想定通りSQSの暗号化の部分でテストが失敗していることが分かります。
該当箇所を戻して(false -> true)、GitHubにPushし直します。
Terraform Cloud上でテストが実行されて、成功しました。
バージョンを公開します。指定したブランチ(今回はmain
)のコミット単位で公開するバージョンを選ぶことができます。
Versionが先程設定したバージョンになっていれば完了です。
## 補足: テストが失敗しているバージョンを公開できるか
可能です。現時点では、テストを失敗しているバージョンを公開できなくする機能はありません。(2023/10時点)
機能追加に来たいですね。
おわりに
Terraform CloudのModule Test機能とTest自動生成機能を試して見ました。
Testがあることで、よりモジュールを安全に公開できるようになりました。
パラメータ多いとテストを書くのが大変ですが、自動生成機能を使えば簡単にテストが書けそうです。
以上、AWS事業本部の佐藤(@chari7311)でした。